<?php


/**
 * Notes:
 * PROJECT_NAME : ERP v1.8 重构erp
 * User: 夏鱼儿<397072174@qq.com>
 * Date: 2024/4/25
 * Time: 15:59
 */

namespace app\service\traits\model;

use Overtrue\EasySms\EasySms;
use Overtrue\EasySms\Exceptions\InvalidArgumentException;
use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;
use think\facade\Cache;

trait Sms
{
    /**
     * @param $phone
     * @param $scene
     * @param string $code
     * @return bool
     * @throws InvalidArgumentException
     */
    public function send($phone, $scene, string $code = ''): bool
    {
        try {
            // 创建 EasySms 实例
            $easySms = new EasySms(config('sms'));
            //验证发送次数
            if(Cache::get('sms_' . $phone) > config('sms.max_count')){
                // 发送次数过多
                return false;
            }
            // 发送短信
            $result = $easySms->send($phone, [
                'template' => config("sms.gateways.aliyun.template." . $scene),
                'data'     => [
                    'code' => $code, // 替换短信模板中的变量
                ],
            ]);
            // 处理发送结果
            if ($result['aliyun']['status'] !== 'success') return false;
        } catch (NoGatewayAvailableException $exception) {
            // 捕获异常并输出错误信息
            $errors = $exception->getExceptions();
            foreach ($errors as $error) {
                return false;// 发送成功
            }
        }
        return true;// 发送成功
    }

    /**
     * 校验短信验证码
     * @param $phone
     * @param $scene
     * @param string $code
     * @return bool
     */
    public function check($phone, $scene, string $code = ''): bool
    {
        // 检查验证码是否正确
        $cache_code = cache('sms_'.$scene.'_'.$phone);
        if (!$cache_code) return false;
        if($code){
            if ($cache_code != $code) return false;
        }
        cache('sms_'.$scene.'_'.$phone, null);
        return true;// 验证码正确
    }
}